/**   
 * 项目名：五位一体化工安全信息平台
 * 日期：    2019-12-07 14:44:45  
 * Copyright (c) 2015- joysuch-版权所有     
 */

package com.joysuch.wwyt.bp.service.impl;

import javax.transaction.Transactional;

import com.joysuch.wwyt.bp.bean.BpMainProductDetailBean;
import com.joysuch.wwyt.bp.bean.BpMainProductEditBean;
import com.joysuch.wwyt.bp.bean.BpMainProductListBean;
import com.joysuch.wwyt.bp.bean.BpMainProductListBean.Search;
import com.joysuch.wwyt.bp.entity.BpMainProduct;
import com.joysuch.wwyt.bp.entity.dsl.QBpMainProduct;
import com.joysuch.wwyt.bp.repository.BpMainProductDao;
import com.joysuch.wwyt.bp.service.BpMainProductService;
import com.joysuch.wwyt.core.common.util.PageDataUtils;
import com.joysuch.wwyt.core.common.util.PageDataUtils.PageDataConvert;
import com.joysuch.wwyt.core.service.BizCodeGeneratorFacade;
import com.querydsl.core.types.ExpressionUtils;
import com.querydsl.core.types.Predicate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

@Service
@Transactional
public class BpMainProductServiceImpl implements BpMainProductService {

    @Autowired
    private BpMainProductDao dao;
    @Autowired
    private BizCodeGeneratorFacade bizCodeGeneratorFacade;

    @Override
    public BpMainProduct add(BpMainProductEditBean entity) throws Exception {
        BpMainProduct content = new BpMainProduct();
        // 编号
        content.setCode(bizCodeGeneratorFacade.zhuYaoChanPin());
        // 名称
        content.setName(entity.getName());
        // 年产量
        content.setOutput(entity.getOutput());
        // 产量单位
        content.setOutputUnit(entity.getOutputUnit());
        // 主要生产工艺
        content.setManufaturingTech(entity.getManufaturingTech());
        // 备注
        content.setRemark(entity.getRemark());
        // 附件ID
        content.setAttachmentId(entity.getAttachmentId());
        return dao.save(content);
    }

    @Override
    public void update(BpMainProductEditBean entity) throws Exception {
        BpMainProduct content = dao.findById(entity.getId()).get();
        // ID
        content.setId(entity.getId());
        // 编号
        content.setCode(entity.getCode());
        // 名称
        content.setName(entity.getName());
        // 年产量
        content.setOutput(entity.getOutput());
        // 产量单位
        content.setOutputUnit(entity.getOutputUnit());
        // 主要生产工艺
        content.setManufaturingTech(entity.getManufaturingTech());
        // 备注
        content.setRemark(entity.getRemark());
        // 附件ID
        content.setAttachmentId(entity.getAttachmentId());
        dao.save(content);
    }

    @Override
    public Page<BpMainProductListBean> findByPage(Pageable page, Search condition) {
        Predicate predicate = prepareListSearchCondition(condition);
        Page<BpMainProduct> data = predicate == null ? dao.findAll(page) : dao.findAll(predicate, page);

        return PageDataUtils.convertPageData(data, new PageDataConvert<BpMainProductListBean, BpMainProduct>() {
            @Override
            public BpMainProductListBean convert(BpMainProduct f) {
                BpMainProductListBean bean = new BpMainProductListBean();
                // ID
                bean.setId(f.getId());
                // 编号
                bean.setCode(f.getCode());
                // 名称
                bean.setName(f.getName());
                // 年产量
                bean.setOutput(f.getOutput());
                // 产量单位
                bean.setOutputUnit(f.getOutputUnit());
                // 主要生产工艺
                bean.setManufaturingTech(f.getManufaturingTech());
                // 备注
                bean.setRemark(f.getRemark());
                // 附件ID
                bean.setAttachmentId(f.getAttachmentId());
                return bean;
            }
        });
    }

    private Predicate prepareListSearchCondition(Search condition) {
        QBpMainProduct q = QBpMainProduct.bpMainProduct;
        Predicate predicate = null;
        if (condition.getNameOrCode() != null && !"".equals(condition.getNameOrCode())) {
            predicate = ExpressionUtils.or(q.name.contains(condition.getNameOrCode()),
                    q.code.contains(condition.getNameOrCode()));
        }
        return predicate;
    }

    @Override
    public void delete(Long id) {
        // 校验业务逻辑是否允许删除。如本数据被其他业务关联，删除后导致其他业务不可用。不能删除时将抛出业务异常
        checkBussinessRestrictions(id);
        dao.deleteById(id);
    }

    /*
     * *
     * 校验业务逻辑是否允许删除。如本数据被其他业务关联，删除后导致其他业务不可用
     * 
     * @param id 要删除的业务ID
     * 
     * @throws 抛出的业务异常
     */

    private void checkBussinessRestrictions(Long id) {

    }

    @Override
    public BpMainProduct findById(Long id) {
        return dao.findById(id).get();
    }

    @Override
    public BpMainProductDetailBean getById(Long id) {
        BpMainProduct entity = findById(id);
        BpMainProductDetailBean bean = new BpMainProductDetailBean();
        // ID
        bean.setId(entity.getId());

        // 编号
        bean.setCode(entity.getCode());

        // 名称
        bean.setName(entity.getName());

        // 年产量
        bean.setOutput(entity.getOutput());

        // 产量单位
        bean.setOutputUnit(entity.getOutputUnit());

        // 主要生产工艺
        bean.setManufaturingTech(entity.getManufaturingTech());

        // 备注
        bean.setRemark(entity.getRemark());

        // 附件ID
        bean.setAttachmentId(entity.getAttachmentId());
        // bean.setAttachmentName(entity.getAttachmentName());

        return bean;
    }

}
